package com.zyf.project.binaryproto.converter.impl.dynamic;

import com.zyf.project.binaryproto.converter.impl.AbstractDynamicValueConverter;
import org.jetbrains.annotations.NotNull;
import utils.binary.BytesUtils;
import utils.binary.impl.BytesSlice;
import utils.binary.io.BytesOutputBuffer;

/**
 * <h1>字符串类型值转换器</h1>
 * <p>继承了 {@link AbstractDynamicValueConverter} 抽象类</p>
 * <p>处理 {@link String} 类型的值</p>
 *
 * @author Zhou Yifan
 */
public class StringValueConverter extends AbstractDynamicValueConverter {

    public StringValueConverter() {
        super(String.class);
    }

    /**
     * 写入一个动态长度的值，以一个头部的长度字节开始
     *
     * @param value  待写入的值
     * @param buffer 目标缓存
     * @return 写入的字节数
     */
    @Override
    public int encode(Object value, BytesOutputBuffer buffer) {
        byte[] bytes = value == null ? BytesUtils.EMPTY_BYTES : BytesUtils.toBytes((String) value);
        int size = bytes.length;
        size += writeSize(bytes.length, buffer);
        buffer.write(bytes);
        return size;
    }

    /**
     * 数据片解码
     *
     * @param dataSlice 数据片
     * @return 解码后的对象
     */
    @Override
    public Object decode(@NotNull BytesSlice dataSlice) {
        return dataSlice.getString();
    }
}
